// 加载项目所需的项目依赖
const createError = require('http-errors');
const express = require('express');   // express 框架文件
const path = require('path');   // 路径模块
const cookieParser = require('cookie-parser');
const logger = require('morgan');
const ejs = require('ejs');   // 模版引擎
const bodyParser = require('body-parser');   // 解析 POST 请求
const cors = require('cors');    // 跨域资源共享


// 创建后台的应用程序
const app = express();

// ❤❤❤view engine setup  <====>  设置引擎设置

// 视图渲染引擎
app.set('views', path.join(__dirname, 'views'));
// 配置Express 视图引擎
app.engine('html', ejs.__express);
app.set('view engine', 'html');


// ❤❤❤❤使用的中间件  请求---------------------中间件---------------------响应
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());


// parse application/x-www-form-urlencoded  <====>  解析应用程序/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))
// parse application/json  <====>  解析应用程序/json
app.use(bodyParser.json())
// 设置资源跨域共享
app.use(cors())

// ❤❤❤使用并设置路由（设置URL）
app.use('/text', async (req, res) => {
  res.send('<h1>Hello World<h1/>')
})


// api接口
// 处理图片的功能接口
app.use('/api/photo', require('./routes/api/photo'))
app.use('/api/email', require('./routes/api/email'))
app.use('/api/user', require('./routes/api/user'))
app.use('/api/admin', require('./routes/api/admin'))
app.use('/api/banner', require('./routes/api/banner'))

app.use('/api/classify', require('./routes/api/classify'))
app.use('/api/article', require('./routes/api/article'))



// web网页



// 设置静态资源
// __dirname  express 内置的全局变量，代表绝对路径的意思
app.use(express.static(path.join(__dirname, 'public')));





// ❤❤❤catch 404 and forward to error handler  <====>  catch 404并转发到错误处理程序
app.use(function (req, res, next) {
  next(createError(404));
});

// ❤❤❤error handler  <====>  错误处理程序
app.use(function (err, req, res, next) {
  // ❤❤❤❤set locals, only providing error in development  <====>  设置局部变量，只在开发中提供错误
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // ❤❤❤❤render the error page  <====>  呈现错误页面
  res.status(err.status || 500);
  res.render('error');
});



// module  模块系统对象
// 把 app 挂载到系统对象上，以后可以在 www 这个执行文件上使用
module.exports = app;
